package com.npf.imgserver.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.config.rules.PropertyInfo;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

/**
 * mybatis-plus代码生成器
 */
public class CodeGeneration {


    private static File file = new File("");
    private static String path = file.getAbsolutePath();

    public static void main(String[] args) {

        final ResourceBundle properties = ResourceBundle.getBundle("mybatis-plus-generation");

        AutoGenerator autoGenerator = new AutoGenerator().setGlobalConfig(
                // 全局配置
                new GlobalConfig()
                        .setOutputDir(path + properties.getString("outputDir")) //生成路径
                        .setFileOverride(true) //是否文件覆盖
                        .setActiveRecord(false)// 不需要ActiveRecord特性的请改为false
                        .setEnableCache(false)// XML 二级缓存
                        .setBaseResultMap(true)// XML ResultMap
                        .setBaseColumnList(true)// XML columList  列集合
                        .setAuthor(properties.getString("author"))// 作者
                        .setIdType(IdType.AUTO)//主键类型
                        // 自定义文件命名，注意 %s 会自动填充表实体属性！
                        .setControllerName("%sController")
                        .setServiceName("%sService")//设置生成的 service 接口的名字的首字母是否为 I  IUserService
                        .setServiceImplName("%sServiceImpl")
                        .setMapperName("%sMapper")
                        .setXmlName("%sMapper")
        ).setDataSource(
                // 数据源配置
                new DataSourceConfig()
                        .setDbType(DbType.MYSQL)
                        .setDriverName(properties.getString("mysql.driver"))
                        .setUsername(properties.getString("mysql.user"))
                        .setPassword(properties.getString("mysql.password"))
                        .setUrl(properties.getString("mysql.url"))
                        .setTypeConvert(new ITypeConvert() {
                            @Override
                            public PropertyInfo processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                                String t = fieldType.toLowerCase();
                                if (t.contains("datetime")) {
                                    return DbColumnType.DATE;
                                }
                                return new MySqlTypeConvert().processTypeConvert(globalConfig, fieldType);
                            }
                        })
        ).setStrategy(
                // 策略配置
                new StrategyConfig()
                        //.setTablePrefix("")// 此处可以修改为您的表前缀
                        .setCapitalMode(true)//全局大写命名
                        //.setDbColumnUnderline(true)//指定表名字段名是否使用下划线
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                        .setInclude("img_info") // 需要生成的表

                        .setSuperServiceClass(null)
                        .setSuperServiceImplClass(null)
                        .setSuperMapperClass(null)
        ).setPackageInfo(
                // 包名策略配置
                new PackageConfig()
                        .setParent(properties.getString("parent") + (properties.getString("module") != null ? "." +properties.getString("module") : "" ))
                        .setController("controller")
                        .setService("service.api")
                        .setServiceImpl("service.impl")
                        .setEntity("entity")
                        .setMapper("dao")
                        .setXml("mapper")
        ).setCfg(
                // 注入自定义配置，可以在 VM 中使用 cfg.comadmin 设置的值
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map<String, Object> map = new HashMap<>();
//                        map.put("comadmin", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                        this.setMap(map);
                    }
                }.setFileOutConfigList(Collections.<FileOutConfig>singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
                    // 自定义输出文件目录
                    @Override
                    public String outputFile(TableInfo tableInfo) {
                        return path + properties.getString("outputDirXml")
                                + (properties.getString("module") != null ? "/" + properties.getString("module") : "")
                                + "/" + tableInfo.getEntityName() + "Mapper.xml";
                    }
                }))
        ).setTemplate(
                // 关闭默认 xml 生成，调整生成 至 根目录
                new TemplateConfig().setXml(null)
                // 自定义模板配置，模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
                // 至您项目 src/main/resources/template 目录下，模板名称也可自定义如下配置：
                // .setController("...");
                // .setEntity("...");
                // .setMapper("...");
                // .setXml("...");
                // .setService("...");
                // .setServiceImpl("...");
        );

        // 执行生成
        autoGenerator.execute();
    }
}
